#include "Personaje.h"
#include "Contenido.h"
#include "EscenarioModelo.h"
#include <SDL.h>
#include "Logger.h"
#include <sstream>

int Personaje::PRECEDENCIA_CONT = 0;

Personaje::Personaje(TexturasPersonaje* texturas, ObjetoVivo* objeto ,const string& id){
	this->texturas = texturas ;
	this->textura = texturas->getSiguienteDerecha();
	this->objeto = objeto;
	this->id = new string(id);
	this->movimientoAutomatico = false;
	this->rectanguloPrevio = new SDL_Rect();
	this->vivir();

	// PAra saber como dibujarlos
	Personaje::PRECEDENCIA_CONT++ ;
	this->precedencia = Personaje::PRECEDENCIA_CONT++ ;
}

void Personaje::morir(){
	this->muerto = true;
}

void Personaje::vivir(){
	this->muerto = false;
}

bool Personaje::isMuerto(){
	return this->muerto ;
}

int Personaje::getPrecedencia(){
	return this->precedencia;
}

bool Personaje::dibujarArriba(Personaje* otro){
	return (otro->getPrecedencia() < this->getPrecedencia() );
}


// "coord" sera el punto x o y de un Punto , "medida" sera el alto o el ancho
int Personaje::getValueByPosicion(int coord, int medida){
	int factorMapeo = EscenarioModelo::getEscenario()->getSendero()->getFactorMapeo();
	float altoSendero = (float)( (float)Contenido::getAltoContenido() / (float)factorMapeo ) ;
	float resAux = ((float)	coord + (float)0.5 ) * (float)altoSendero ;
	float res = resAux - ((float)medida/(float)2);
	
	return (int)(res) ;
}

int Personaje::getFila(){
	return this->getValueByPosicion(this->objeto->getPosicion()->getY(),this->getAlto());
}

int Personaje::getColumna(){
	return this->getValueByPosicion(this->objeto->getPosicion()->getX(),this->getAncho());
}

SDL_Rect* Personaje::getRectanguloPrevio(){
	this->rectanguloPrevio->h = this->getAlto();//this->texturas->getAltoAnterior();
	this->rectanguloPrevio->w =	this->getAncho();//this->texturas->getAnchoAnterior();

	this->rectanguloPrevio->x = this->getValueByPosicion(this->getObjeto()->getPosicionAnterior()->getX(),this->rectanguloPrevio->w);
	this->rectanguloPrevio->y = this->getValueByPosicion(this->getObjeto()->getPosicionAnterior()->getY(),this->rectanguloPrevio->h);
	
	return this->rectanguloPrevio;
}

string Personaje::getId(){
	return this->id->c_str();
}

Textura* Personaje::getTextura(){
	return this->textura;
}


int Personaje::getAncho(){
	if(this->textura)
		return this->textura->getImagen()->getAncho();
	return 0;
}

ObjetoVivo* Personaje::getObjeto(){
	return this->objeto;
}


int Personaje::getAlto(){
	if(this->textura)
		return this->textura->getImagen()->getAlto();
	return 0;
}

bool Personaje::equals(Personaje* otroPersonaje){
	if(this->getId().compare(otroPersonaje->getId())==0)
		return true;
	else
		return false ;
}

Personaje::~Personaje(){
	delete this->texturas ;
	delete this->id;
	// Se mata en el escenario modelo.
	//delete this->objeto;
	this->objeto = 0;
	delete this->rectanguloPrevio ;

}